/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* ���Ҫ�ڳ�����ʹ�ô˴���,���ڳ�����ע��ʹ����STC�����ϼ�����            */
/*---------------------------------------------------------------------*/

#include "STC8G_H_EEPROM.h"

//========================================================================
// ����: void	ISP_Disable(void)
// ����: ��ֹ����ISP/IAP.
// ����: non.
// ����: non.
// �汾: V1.0, 2012-10-22
//========================================================================
void	DisableEEPROM(void)
{
	IAP_CONTR = 0;			//��ֹIAP����
	IAP_CMD   = 0;			//ȥ��IAP����
	IAP_TRIG  = 0;			//��ֹIAP�����󴥷�
	IAP_ADDRH = 0xff;		//��0��ַ���ֽ�
	IAP_ADDRL = 0xff;		//��0��ַ���ֽڣ�ָ���EEPROM������ֹ�����
}

//========================================================================
// ����: void EEPROM_Trig(void)
// ����: ����EEPROM����.
// ����: none.
// ����: none.
// �汾: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
	F0 = EA;    //����ȫ���ж�
	EA = 0;     //��ֹ�ж�, ���ⴥ��������Ч
	IAP_TRIG = 0x5A;
	IAP_TRIG = 0xA5;                    //����5AH������A5H��IAP�����Ĵ�����ÿ�ζ���Ҫ���
																			//����A5H��IAP������������������
																			//CPU�ȴ�IAP��ɺ󣬲Ż����ִ�г���
	nop();
	nop();
	EA = F0;    //�ָ�ȫ���ж�
}

//========================================================================
// ����: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
// ����: ��ָ��EEPROM�׵�ַ����n���ֽڷ�ָ���Ļ���.
// ����: EE_address:  ����EEPROM���׵�ַ.
//       DataAddress: �������ݷŻ�����׵�ַ.
//       number:      �������ֽڳ���.
// ����: non.
// �汾: V1.0, 2012-10-22
//========================================================================
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
	IAP_ENABLE();                           //���õȴ�ʱ�䣬����IAP��������һ�ξ͹�
	IAP_READ();                             //���ֽڶ���������ı�ʱ����������������
	do
	{
		IAP_ADDRH = EE_address / 256;       //�͵�ַ���ֽڣ���ַ��Ҫ�ı�ʱ���������͵�ַ��
		IAP_ADDRL = EE_address % 256;       //�͵�ַ���ֽ�
		EEPROM_Trig();                      //����EEPROM����
		*DataAddress = IAP_DATA;            //��������������
		EE_address++;
		DataAddress++;
	}while(--number);

	DisableEEPROM();
}

//========================================================================
// ����: void EEPROM_SectorErase(u16 EE_address)
// ����: ��ָ����ַ��EEPROM��������.
// ����: EE_address:  Ҫ����������EEPROM�ĵ�ַ.
// ����: non.
// �汾: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u16 EE_address)
{
	IAP_ENABLE();                       //���õȴ�ʱ�䣬����IAP��������һ�ξ͹�
	IAP_ERASE();                        //�����, ������������������ı�ʱ����������������
																			//ֻ������������û���ֽڲ�����512�ֽ�/������
																			//����������һ���ֽڵ�ַ����������ַ��
	IAP_ADDRH = EE_address / 256;       //��������ַ���ֽڣ���ַ��Ҫ�ı�ʱ���������͵�ַ��
	IAP_ADDRL = EE_address % 256;       //��������ַ���ֽ�
	EEPROM_Trig();                      //����EEPROM����
	DisableEEPROM();                    //��ֹEEPROM����
}

//========================================================================
// ����: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
// ����: �ѻ����n���ֽ�д��ָ���׵�ַ��EEPROM.
// ����: EE_address:  д��EEPROM���׵�ַ.
//       DataAddress: д��Դ���ݵĻ�����׵�ַ.
//       number:      д����ֽڳ���.
// ����: non.
// �汾: V1.0, 2012-10-22
//========================================================================
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
	IAP_ENABLE();                       //���õȴ�ʱ�䣬����IAP��������һ�ξ͹�
	IAP_WRITE();                        //�����, ���ֽ�д����
	do
	{
		IAP_ADDRH = EE_address / 256;     //�͵�ַ���ֽڣ���ַ��Ҫ�ı�ʱ���������͵�ַ��
		IAP_ADDRL = EE_address % 256;     //�͵�ַ���ֽ�
		IAP_DATA  = *DataAddress;         //�����ݵ�IAP_DATA��ֻ�����ݸı�ʱ����������
		EEPROM_Trig();                    //����EEPROM����
		EE_address++;                     //��һ����ַ
		DataAddress++;                    //��һ������
	}while(--number);                   //ֱ������
	DisableEEPROM();
}

